package com.laiqilin.excep;

import com.laiqilin.utils.ResponseEnum;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 自定义业务异常类，继承自 RuntimeException。
 * 提供多个构造函数以支持不同的初始化方式。
 */
@Data
@NoArgsConstructor
public class BusinessException extends RuntimeException {

	private Integer code;   // 错误代码
	private String message; // 错误信息

	/**
	 * 通过错误信息创建 BusinessException。
	 *
	 * @param message 错误信息
	 */
	public BusinessException(String message) {
		this.message = message;
	}

	/**
	 * 通过错误信息和错误代码创建 BusinessException。
	 *
	 * @param message 错误信息
	 * @param code 错误代码
	 */
	public BusinessException(String message, Integer code) {
		this.message = message;
		this.code = code;
	}

	/**
	 * 通过错误信息、错误代码和原因创建 BusinessException。
	 *
	 * @param message 错误信息
	 * @param code 错误代码
	 * @param cause 异常原因
	 */
	public BusinessException(String message, Integer code, Throwable cause) {
		super(cause);  // 调用父类的构造函数传入原因
		this.message = message;
		this.code = code;
	}

	/**
	 * 通过 ResponseEnum 枚举类型创建 BusinessException。
	 *
	 * @param resultCodeEnum ResponseEnum 枚举类，包含错误信息和代码
	 */
	public BusinessException(ResponseEnum resultCodeEnum) {
		this.message = resultCodeEnum.getMessage();
		this.code = resultCodeEnum.getCode();
	}

	/**
	 * 通过 ResponseEnum 枚举类型和原因创建 BusinessException。
	 *
	 * @param resultCodeEnum ResponseEnum 枚举类，包含错误信息和代码
	 * @param cause 异常原因
	 */
	public BusinessException(ResponseEnum resultCodeEnum, Throwable cause) {
		super(cause);  // 调用父类的构造函数传入原因
		this.message = resultCodeEnum.getMessage();
		this.code = resultCodeEnum.getCode();
	}
}
